#include "pair_process.h"
#include "gzll.h"
#include "gzp.h"

pair_para_t pair_para;

/**
 * @brief 读主机地址
 * 
 * @param addr 闪存起始地址
 * @param buf 指向存储数据的 RAM 缓冲区指针
 * @param size 要复制的字节数
 */
static void Pair_Flash_Read(uint32_t addr, uint32_t *buf, uint8_t size)
{
    uint8_t *buf_8 = (uint8_t *)buf;
    uint8_t i;

    /* copy from flash to ram*/
    for (i = 0; i < size; i++, addr++, buf_8++) {
        *buf_8 = *(volatile uint8_t *)addr;
    }
}

/**
 * @brief 获取配对信息
 * 
 * @param buf 存储地址
 * @param len 字节长度
 */
void Pair_Info_Get(uint8_t *buf, uint8_t len)
{
    __disable_irq();
    Pair_Flash_Read(PAIR_FLASH_ADDR, (uint32_t *)buf, len);
    __enable_irq();
}

/**
 * @brief 配对信息初始化
 */
void Pair_Info_Init(void)
{
    Pair_Info_Get(&pair_para.buf[0], 6);
    if (0xaa == pair_para.info.sta) {
        gzp_update_radio_params(&pair_para.info.addr[0]);   
    }
}

FLASH_Status last_status = FLASH_COMPLETE;
/**
 * @brief 保存配对信息
 * 
 * @param buf 存储地址
 * @param len 字节长度
 */
void Pair_Info_Set(uint8_t *buf, uint8_t len)
{
    FLASH_Status status = FLASH_COMPLETE;

    if (6 != len) {
        return;
    }

    __disable_irq();
	
	FLASH_Unlock();
	
    // 擦除闪存页，并检查擦除状态
    status = FLASH_ErasePage(PAIR_FLASH_ADDR);
    if (status != FLASH_COMPLETE) {
        __enable_irq();
        last_status = status;
        return;
    }

    // 每次处理两个 uint8_t 数据，合并成一个 uint16_t 数据写入
    for (uint8_t i = 0; i < len; i += 2) {
        uint16_t data_to_write;
        // 合并两个 uint8_t 数据为一个 uint16_t 数据
        if (i + 1 < len) {
            data_to_write = (uint16_t)buf[i] | ((uint16_t)buf[i + 1] << 8);
        } else {
            // 如果最后只剩下一个字节，另一个字节补 0
            data_to_write = (uint16_t)buf[i];
        }

        // 使用 FLASH_ProgramHalfWord 写入数据
        status = FLASH_ProgramHalfWord(PAIR_FLASH_ADDR + i, data_to_write);
        last_status = status;
        if (status != FLASH_COMPLETE) {
            break;
        }
    }
	FLASH_Lock();
    __enable_irq();
}

